;;; hyrolo-menu.el --- Pulldown and popup menus of HyRolo commands  -*- lexical-binding: t; -*-
;;
;; Author:       Bob Weiner
;;
;; Orig-Date:    28-Oct-94 at 10:59:44
;; Last-Mod:     15-Jun-25 at 22:37:19 by Bob Weiner
;;
;; SPDX-License-Identifier: GPL-3.0-or-later
;;
;; Copyright (C) 1994-2025  Free Software Foundation, Inc.
;; See the "HY-COPY" file for license information.
;;
;; This file is part of GNU Hyperbole.

;;; Commentary:

;;; Code:
;;; ************************************************************************
;;; Other required Elisp libraries
;;; ************************************************************************

(require 'easymenu)
(require 'hyrolo)

;;; ************************************************************************
;;; Public variables
;;; ************************************************************************

(defconst infodock-hyrolo-menu
  (delq nil
	(list
	 "Rolo"
	 ["Manual"                  (id-info "(hyperbole)HyRolo")            t]
	 "----"
	 ;; Delete Rolo menu from all menubars.
	 ["Remove-This-Menu"        (hui-menu-remove Rolo hyrolo-mode-map)   t]
	 "----"
	 ["Add-Entry"               (id-tool-invoke 'hyrolo-add)             t]
	 (when (fboundp 'consult-grep) ;; allow for autoloading
	   ;; Interactively narrow HyRolo matches using Consult/Vertico.
           ["Consult-Find"          (id-tool-invoke 'hyrolo-consult-grep)    t])
	 ["Delete-Entry"            (id-tool-invoke 'hyrolo-kill)            t]
	 ["Display-Prior-Matches"   (id-tool-invoke 'hyrolo-display-matches) t]
	 ["Edit-Entry"              (id-tool-invoke 'hyrolo-edit)            t]
	 ["Find-HyRolo-File"        (id-tool-invoke
				     (lambda ()
				       (require 'hyrolo)
				       (hyrolo-find-file)))
	  t]
	 ["Insert-Entry-at-Point"   (id-tool-invoke 'hyrolo-yank)            t]
	 ["Mail-to-Address"         (id-tool-invoke 'hyrolo-mail-to)         t]
	 ["Search-for-Regexp"       (id-tool-invoke 'hyrolo-grep)            t]
	 ["Search-for-String"       (id-tool-invoke 'hyrolo-fgrep)           t]
	 ["Search-for-Word"         (id-tool-invoke 'hyrolo-word)            t]
	 ["Sort-Entries"            (id-tool-invoke 'hyrolo-sort)            t]
	 ["Tag-Find"                (id-tool-invoke 'hyrolo-tags-view)       t])))

(defconst hyrolo-menu-common-body
  '(
    ("Move"
     ["Scroll-Backward"        scroll-down                              t]
     ["Scroll-Forward"         scroll-up                                t]
     ["To-Beginning"           beginning-of-buffer                      t]
     ["To-End"                 end-of-buffer                            t]
     "----"
     ["To-Next-Entry"          hyrolo-outline-next-visible-heading      t]
     ["To-Next-Same-Level"     hyrolo-outline-forward-same-level        t]
     ["To-Previous-Entry"      hyrolo-outline-previous-visible-heading  t]
     ["To-Previous-Same-Level" hyrolo-outline-backward-same-level       t]
     ["Up-a-Level"             hyrolo-outline-up-heading                t])
    ("Outline"
     ["Hide (Collapse)"        hyrolo-outline-hide-subtree              t]
     ["Show (Expand)"          hyrolo-outline-show-subtree              t]
     ["Show-All"               hyrolo-outline-show-all                  t]
     ["Show-Only-First-Line"   hyrolo-outline-hide-body                 t]))
  "The middle menu entries common to all HyRolo menus.")

(defconst id-popup-hyrolo-menu
  (append
   '("Rolo"
     ["Help"                   describe-mode                            t]
     ["Manual"                 (id-info "(hyperbole)Rolo Keys")         t]
     "----"
     ["Edit-Entry-at-Point"    hyrolo-edit-entry                        t]
     "----"
     ["Locate-Entry-Isearch"   hyrolo-locate                            t]
     ["Next-Match"             hyrolo-next-match                        t]
     ["Previous-Match"         hyrolo-previous-match                    t]
     "----")
   `,@hyrolo-menu-common-body
   (list infodock-hyrolo-menu)
   '("----"
     ["Quit"                   (id-tool-quit '(hyrolo-quit))            t])))

;;; ************************************************************************
;;; Public functions
;;; ************************************************************************

(defun hyrolo-menubar-menu ()
  "Add a HyRolo menu to the rolo match buffer menubar."
  (define-key hyrolo-mode-map [C-down-mouse-3] 'hyrolo-popup-menu)
  (define-key hyrolo-mode-map [C-mouse-3] nil)
  (unless (global-key-binding [menu-bar Rolo])
    (easy-menu-define nil hyrolo-mode-map "Rolo Menubar Menu" id-popup-hyrolo-menu)
    ;; Force a menu-bar update.
    (force-mode-line-update)))

(defun hyrolo-popup-menu (event)
  "Popup the Hyperbole Rolo match buffer menu."
  (interactive "@e")
  (mouse-set-point event)
  (popup-menu id-popup-hyrolo-menu))

(add-hook 'hyrolo-mode-hook #'hyrolo-menubar-menu)

(provide 'hyrolo-menu)

;;; hyrolo-menu.el ends here
